package kgame5.k3d.core.obj3d.info.geometry {
import kgame5.k3d.core.math.NumberUV;
import kgame5.k3d.core.math.Vector3D;
import kgame5.k3d.core.math.Vertex3D;
import kgame5.k3d.core.obj3d.info.material.MaterialInfo;
import kgame5.k3d.core.render.Culler;

import flash.display.Graphics;
import flash.display.TriangleCulling;

/**
 * @author kk
 * 一个三角面，内部使用的
 * 保持了本地顶点坐标，和纹理坐标
 * 当有东西
 */
public class Face3D {
	public static const SORT_NAME:String="screenZ";
	//排序用的
	public var screenZ:Number=1;//在摄像机空间的z
	
	public var mi:MaterialInfo;
	
	//这些是给绘图用的:drawTriangle
	public var arrUV:Vector.<Number> = new Vector.<Number>();//uv坐标 
    private var arrScreenPoint:Vector.<Number> = new Vector.<Number>();//三角三个顶点在屏幕的坐标 
    //private  var indices:Vector.<int> = new Vector.<int>();    
	
	//顶点的引用.挂接系统需要这个东西
	public var v0:Vertex3D;
	public var v1:Vertex3D;
	public var v2:Vertex3D;
	
	
	
	//三个顶点在aVertex里的索引,这个是克隆和绘图用的
	public var a:int;
	public var b:int;
	public var c:int;
	
	//三个顶点在aNumberUV里的索引,这个是克隆用的
	public var at:int;
	public var bt:int;
	public var ct:int;
	
	//_________________Method__________________________
	//index是三角面的索引在a2IB_p和a2IB_t的索引
	public function Face3D(gi:GeometryInfo,a:int,b:int,c:int,at:int,bt:int,ct:int){
		//-物体坐标系内的顶点坐标
		v0=gi.aVertex[a];
		v1=gi.aVertex[b];
		v2=gi.aVertex[c];
		
		//-屏幕上的点
		arrScreenPoint.length=6;
		
		//-纹理坐标
		var uv0:NumberUV=gi.aUV[at];
		var uv1:NumberUV=gi.aUV[bt];
		var uv2:NumberUV=gi.aUV[ct];
		arrUV.push(uv0.u,uv0.v,uv1.u,uv1.v,uv2.u,uv2.v); 
		
		//indices.push(0,1,2);
		
		//
		this.a=a;
		this.b=b;
		this.c=c;
		
		this.at=at;
		this.bt=bt;
		this.ct=ct;
	}
	
	//法线
	public var normal:Vector3D=new Vector3D();
	private var _line10:Vector3D=new Vector3D();
	private var _line20:Vector3D=new Vector3D();
	public function updateNormal():void{
		_line10.x=v1.x-v0.x;
		_line10.y=v1.y-v0.y;
		_line10.z=v1.z-v0.z;
		
		_line20.x=v2.x-v0.x;
		_line20.y=v2.y-v0.y;
		_line20.z=v2.z-v0.z;
		
		Vector3D.SOuterProduct(_line20, _line10, normal);
		
		
	}
	
//	//1,填充screen坐标
//	//2,计算ccz
//	//3,计算是否可以裁减（这个很重要，这个涉及到是否需要参与排序）
//	public function update(aScreen:Vector.<Vector3D>):Boolean{
//		
//		var vv0:Vector3D=aScreen[a];
//		var vv1:Vector3D=aScreen[b];
//		var vv2:Vector3D=aScreen[c];
//		
//		//3，排序,摄像机空间的坐标
//		screenZ=vv0.z+vv1.z+vv2.z;
//		
//		//2.屏幕画图点
//		 screen_vertices[0]=vv0.x;
//         screen_vertices[1]=vv0.y;
//             
//         screen_vertices[2]=vv1.x;
//         screen_vertices[3]=vv1.y;
//             
//         screen_vertices[4]=vv2.x;
//         screen_vertices[5]=vv2.y;
//		
//		//4,裁减
//		var temp:Number=(vv2.x - vv0.x ) * ( vv1.y - vv0.y ) - ( vv2.y - vv0.y ) * ( vv1.x - vv0.x );
//		//return Culler.CanCull(finalA.x, finalA.y, finalB.x, finalB.y,finalC.x,finalC.y,cullType);
//		
//		var canCull:Boolean=temp<0;
//		
//		return canCull;
//	}
	
	//1,填充screen坐标
	//2,计算ccz
	//3,计算是否可以裁减（这个很重要，这个涉及到是否需要参与排序）
	public function update():Boolean{
		
		//3，排序,摄像机空间的坐标
		screenZ=v0.screenZ+v1.screenZ+v2.screenZ;
		
		//2.设置屏幕画图点
		 arrScreenPoint[0]=v0.screenX;
         arrScreenPoint[1]=v0.screenY;
             
         arrScreenPoint[2]=v1.screenX;
         arrScreenPoint[3]=v1.screenY;
             
         arrScreenPoint[4]=v2.screenX;
         arrScreenPoint[5]=v2.screenY;
		
		//是否裁剪
		return Culler.CanCull(v0.screenX,v0.screenY,v1.screenX,v1.screenY,v2.screenX,v2.screenY, mi.cullType);
	}

	//渲染一个三角面.注意，因为有了uvt,所以必须要有bmd才可以画
	//,注意，g.begainFill和g.endFill不能放在这里,否则慢
	public function drawFastBmd(g:Graphics):void{
		g.drawTriangles(arrScreenPoint, null, arrUV,TriangleCulling.NONE);//不这样是为了提速 
	}
	
	//渲染一个三角面.注意，uvt是null,这样才能画纯色的
	public function drawFastColor(g:Graphics):void{
		g.drawTriangles(arrScreenPoint, null, null,TriangleCulling.NONE);//不这样是为了提速 
	}
	
	//对于bestGroup3D,因为要存储每个face的个性信息
	public function drawBest(g:Graphics):void{
		g.beginBitmapFill(mi.bmd);
		g.drawTriangles(arrScreenPoint, null, arrUV,TriangleCulling.NONE);//不这样是为了提速 
	}
	//public var bDebug:Boolean=false;
	
	
}//end of class
}
/////////////////////////////
//对于bestGroup3D,因为要存储每个face的个性信息
//	//TODO 这里有bug要修改好
//	public function drawBest(g:Graphics):void{
//		if(!bDebug&&mi!=null){
//			if(mi.bmd==null){
//				g.beginFill(mi.fillColor);
//				g.drawTriangles(screen_vertices, null, null,TriangleCulling.NONE);//不这样是为了提速 
//			}else{
//				g.beginBitmapFill(mi.bmd);
//				g.drawTriangles(screen_vertices, null, uvtData,TriangleCulling.NONE);//不这样是为了提速 
//			}
//		}else{//debug=true
//			bDebug=false;
//			g.beginFill(0xffff00);
//			g.drawTriangles(screen_vertices, null, null,TriangleCulling.NONE);//不这样是为了提速 
//		}
//	}
//	public var bDebug:Boolean=false;